package cn.yudao.ymcc.service.impl;

import cn.yudao.ymcc.domain.CourseType;
import cn.yudao.ymcc.dto.CourseTypeDTO;
import cn.yudao.ymcc.dto.CourseTypeCrumbsDto;
import cn.yudao.ymcc.dto.CrumbVo;
import cn.yudao.ymcc.mapper.CourseTypeMapper;
import cn.yudao.ymcc.service.ICourseTypeService;
import com.baomidou.mybatisplus.mapper.EntityWrapper;
import com.baomidou.mybatisplus.service.impl.ServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;


/**
 * <p>
 * 课程目录 服务实现类
 * </p>
 *
 * @author whale.jia
 * @since 2022-08-07
 */
@Service
@Slf4j
public class CourseTypeServiceImpl extends ServiceImpl<CourseTypeMapper, CourseType> implements ICourseTypeService {

    private static final String COURSE_TREE = "tree";


    private static final String COURSE = "course";


    @Autowired
    private CourseTypeMapper courseTypeMapper;

    @Autowired
    private RedisTemplate<Object,Object> redisTemplate;

    @Override
    @Cacheable(cacheNames = COURSE,key = "'tree'")
    public List<CourseTypeDTO> treeData() {
        log.info("数据库");
        return tree();
    }


    /**
    * @Title: crumbs
    * @Description: 面包屑
    * @Author: Mr.Jia
    * @Version: 1.0
    * @Date:  2022/8/15 19:33
    * @Parameters:
    * @Return
    */
    @Override
    public List<CrumbVo> crumbs(Long courseTypeId) {
//        实现步骤：
//        1.根据courseTypeId，查询出CourseType，得到path
        CourseType courseType = selectById(courseTypeId);
        String path = courseType.getPath();
//        2.根据"\\."分割path，得到所有的面包屑的ID
        String[] split = path.split("\\.");
//        3.遍历每个ID，查询CourseType 封装成 me
        List<CrumbVo> crumbVos = new ArrayList<>();
        for (String id : split) {
            CourseType parent = selectById(Long.valueOf(id));
            CourseTypeCrumbsDto courseTypeDto = new CourseTypeCrumbsDto(Long.valueOf(id),parent.getName());
            EntityWrapper<CourseType> wrapper = new EntityWrapper<>();
            wrapper.eq("pid", parent.getPid());
            List<CourseType> pid = selectList(wrapper);
            List<CourseTypeCrumbsDto> collect = pid.stream().map(type -> new CourseTypeCrumbsDto(type.getId(), type.getName())).collect(Collectors.toList());
            CrumbVo crumbVo = new CrumbVo(courseTypeDto, collect);
            crumbVos.add(crumbVo);
        }
//        4.在根据me的pid查询所有和我评级的CourseType，封装成others
//        5.把me和others搞成一个Vo对象返回给前端即可
        return crumbVos;

    }

    @Override
    @CacheEvict(cacheNames = COURSE, key = "'tree'")
    public boolean deleteById(Serializable id) {
        return super.deleteById(id);
    }

    @Override
    @CacheEvict(cacheNames = COURSE, key = "'tree'")
    public boolean insert(CourseType entity) {
        return super.insert(entity);
    }

    @Override
    @CacheEvict(cacheNames = COURSE, key = "'tree'")
    public boolean updateById(CourseType entity) {
        return super.updateById(entity);
    }

    public List<CourseTypeDTO> tree() {
        // 查询到所有的coursetype
        List<CourseType> courseTypes = courseTypeMapper.selectList(null);
        // 创建一个集合用来装转换CourseType的CourseTypeDTO
        List<CourseTypeDTO> courseTypeDTOS = new ArrayList<>();
        // 创建一个list用来转需要返回前端的集合
        List<CourseTypeDTO> requestList = new ArrayList<>();
        // 创建一个map便于我们快速找到父级
        Map<Long, CourseTypeDTO> map = new HashMap<>();

        courseTypes.stream().map(courseType -> {
            CourseTypeDTO courseTypeDTO = new CourseTypeDTO();
            BeanUtils.copyProperties(courseType, courseTypeDTO);
            courseTypeDTO.setChildren(new ArrayList<>());
            courseTypeDTO.setLabel(courseType.getName());
            courseTypeDTOS.add(courseTypeDTO);
            return courseTypeDTO;
        }).map(x -> map.put(x.getId(), x)).count();

        // 将CourseType转换CourseTypeDTO
//        for (CourseType courseType : courseTypes) {
//            // 将CourseType转换CourseTypeDTO
//            CourseTypeDTO courseTypeDTO = new CourseTypeDTO();
//            BeanUtils.copyProperties(courseType,courseTypeDTO);
//            courseTypeDTO.setChildren(new ArrayList<>());
//            courseTypeDTO.setLabel(courseType.getName());
//
//            // 将CourseTypeDTO装到map和courseTypeDTOS
//            courseTypeDTOS.add(courseTypeDTO);
//            map.put(courseTypeDTO.getId(),courseTypeDTO);
//        }

        // 将每个courseTypeDTO放到他的父级courseTypeDTO的Children集合下
        for (CourseTypeDTO courseTypeDTO : courseTypeDTOS) {
            // 判断是不是一级父级
            if (courseTypeDTO.getPid() == null || courseTypeDTO.getPid() == 0){
                requestList.add(courseTypeDTO);
                continue;
            }
            // 将每个courseTypeDTO放到他的父级courseTypeDTO的Children集合下
            CourseTypeDTO courseTypeDTOPraent = map.get(courseTypeDTO.getPid());
            courseTypeDTOPraent.getChildren().add(courseTypeDTO);
        }
        return requestList;
    }



}
